package com.app.controller.user;

import com.app.aop.has.HasApiLimit;
import com.app.aop.has.HasRedissonLock;
import com.app.aop.has.HasRole;
import com.app.domain.bo.user.UserBo;
import com.app.domain.page.Page;
import com.app.domain.vo.user.UserVo;
import com.app.framework.common.R;
import com.app.service.user.UserService;
import jakarta.annotation.Resource;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.*;

/**
 * 用户控制器
 */
@RestController
@RequestMapping("/api/user")
public class UserController {

    @Resource
    private UserService userService;

    /**
     * 用户列表
     *
     * @param bo 入参
     */
    @PostMapping("/list")
    public R<Page<UserVo>> lists(@RequestBody UserBo bo) {
        return R.ok(userService.lists(bo));
    }

    /**
     * 用户搜索
     *
     * @param bo 入参
     */
    @HasApiLimit()
    @PostMapping("/search")
    public R<Page<UserVo>> search(@RequestBody UserBo bo) {
        Assert.notNull(bo.getName(), "用户名称不能为空");
        return R.ok(userService.search(bo));
    }

    /**
     * 获取登录用户信息
     */
    @GetMapping("/getUserInfo")
    public R<UserVo> getRedisUser() {
        return R.ok(userService.getRedisUser());
    }

    /**
     * 根据ID获取用户信息
     *
     * @param userId 用户ID
     */
    @GetMapping("/details/{userId}")
    public R<UserVo> details(@PathVariable("userId") Long userId) {
        return R.ok(userService.details(userId));
    }

    /**
     * 用户停封
     *
     * @param userId 用户ID
     */
    @HasRole()
    @PostMapping("/stop/{userId}")
    public R<?> stop(@PathVariable("userId") Long userId) {
        userService.stop(userId);
        return R.ok(null, "操作成功");
    }

    /**
     * 修改用户
     *
     * @param bo 入参
     */
    @HasApiLimit(seconds = 5)
    @HasRedissonLock("update_user")
    @PostMapping("/update")
    public R<?> updateOne(@RequestBody UserBo bo) {
        Assert.notNull(bo.getId(), "用户ID不能为空");
        userService.updateOne(bo);
        return R.ok(null, "修改成功");
    }

    /**
     * 用户点赞
     *
     * @param userId 用户ID
     */
    @HasApiLimit(seconds = 5)
    @HasRedissonLock("user_like")
    @PostMapping("/like/{userId}")
    public R<?> like(@PathVariable("userId") Long userId) {
        userService.like(userId);
        return R.ok(null, "点赞成功");
    }

    /**
     * 重载用户
     *
     * @param token token
     */
    @HasApiLimit(seconds = 5)
    @HasRedissonLock("user_refresh")
    @GetMapping("/refresh")
    public R<?> refresh(@RequestHeader("token") String token) {
        userService.refresh(token);
        return R.ok(null, "重载成功");
    }

}